package com.cxyd.service.impl;

import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.cxyd.dao.PlcItemDao;
import com.cxyd.entity.PlcItemEntity;
import com.cxyd.entity.PlcUnitEntity;
import com.cxyd.service.PlcItemService;
import com.cxyd.service.PlcUnitService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

import java.util.Date;
import java.util.List;

@Slf4j
@Service
public class PlcItemServiceImpl implements PlcItemService {
    private final PlcItemDao itemDao;
    private final PlcUnitService unitService;

    public PlcItemServiceImpl(PlcItemDao itemDao, PlcUnitService unitService) {
        this.itemDao = itemDao;
        this.unitService = unitService;
    }

    @Override
    public List<PlcItemEntity> selectItemByUnitNo(String unitNo) {
        QueryWrapper<PlcItemEntity> qw = new QueryWrapper<>();
        qw.lambda().eq(PlcItemEntity::getUnitNo, unitNo);
        return itemDao.selectList(qw);
    }

    @Override
    public void scanHandler(String host, String message) {
//        message的格式：050605 00 02 00 00 00
//        050605为报文头以及数据长度
//        00-正常自动 02-线体1货物数量 00-线体2货物数量
//        00-线体1感应状态 00-线体2感应状态
        log.info("接收到{}信号：{}", host, message);
        if (StrUtil.isBlankIfStr(host) || StrUtil.isBlankIfStr(message)) {
            return;
        }
//        如果接收到的message长度少于规定长度
        if (StrUtil.length(message) < 16) {
            return;
        }

//        根据IP地址获取到设备相关信息
        PlcUnitEntity unit = unitService.getUnitNoByHost(host);
//        根据设备编号获取该设备的信号点
        List<PlcItemEntity> items = selectItemByUnitNo(unit.getUnitNo());
        if (items.isEmpty()) {
            return;
        }
//        循环处理信号点
        items.forEach(item -> {
//            获取新值
            String value = message.substring(item.getItemAddr(), item.getItemAddr() + item.getDataLen());
            if (value.equals(item.getItemValue())) {
                return;
            }
            log.info("线体[{}]点[{}]获取到新值{}", item.getUnitNo(), item.getItemCode(), value);
//            值改变则更新
            item.setOldValue(item.getItemValue());
            item.setItemValue(value);
            item.setUpdateDate(new Date());
            itemDao.updateById(item);
        });
    }
}
